#include "ota_http.h"
//注意要引入这个头文件
#include <curl/curl.h>
#include <log/log.h>
#include <stdlib.h>
#include <string.h>

//接收服务器回应的回调函数(服务器返回数据、切割的每块数据大小（都相等），数量，数据容器)
static size_t receive_callback(void *ptr, size_t size, size_t nmemb, void *stream){
    //1.获取数据（对于获取版本号来说是json字符串）
    char *recv_data = (char *)ptr;
    //2.获取数据大小
    int recv_size = size*nmemb;
    //3.创建字符指针指向数据容器(为了加个结束标记)
    char *json = (char *)stream;
    //4.将数据写入容器（外面定义的json容器,往容器json（stream）里写数据（ptr））
    memcpy(json, recv_data, recv_size);
    json[recv_size] = '\0';
    return recv_size;
}

//获取json版本号
char * ota_http_getJson(char *url){
    //1.创建curl对象
    CURL *curl = curl_easy_init();
    //2.设置请求的url（参数2：配置URL选项）
    curl_easy_setopt(curl, CURLOPT_URL, url);
    //3.设置接收响应数据的回调函数(参数2：写功能函数,说人话就是发送完请求通过回调函数接收回应的json数据)
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_callback);
    //4.设置向接收响应数据的回调函数的参数（数据容器）
    char *json=malloc(1024);
    //参数2：设置往json容器里写数据
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json);

    //5.执行请求（返回值用来判断是否执行成功）
    CURLcode code = curl_easy_perform(curl);
    if(code != CURLE_OK){
        log_error("请求获取json执行失败");
        //释放资源
        free(json);
        curl_easy_cleanup(curl);
        return NULL;
    }
    //6.释放资源
    log_debug("请求获取json执行成功");
    curl_easy_cleanup(curl);
    return json;
}

//下载更新包
int ota_http_download(char *url, char *local_path){
    //1.创建curl对象
    CURL *curl = curl_easy_init();
    //2.设置请求的url（参数2：配置URL选项）
    curl_easy_setopt(curl, CURLOPT_URL, url);
    //3.设置接收响应数据的回调函数(参数3：别人写好的回调函数，直接用，为了获取文件)
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    //4.设置接收数据容器（文件）（参数2：一块快写设置）
    FILE *file = fopen(local_path, "wb");
    //5.把容器传给回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
    //6.执行请求（返回值用来判断是否执行成功）
    CURLcode code = curl_easy_perform(curl);
    if(code != CURLE_OK){
        log_error("请求下载更新包执行失败");
        //释放资源
        fclose(file);
        curl_easy_cleanup(curl);
        return -1;
    }
    //7.释放资源
    log_debug("请求下载更新包执行成功");
    fclose(file);
    curl_easy_cleanup(curl);
    return 0;
}

